// 运行时配置
import { AxiosResponse, history, RequestConfig } from '@umijs/max';
import { message } from 'antd';

// 全局初始化数据配置，用于 Layout 用户信息和权限初始化
// 更多信息见文档：https://umijs.org/docs/api/runtime-config#getinitialstate
export async function getInitialState(): Promise<{ name: string }> {
  return { name: '@umijs/max' };
}

// 请求拦截器
export const request: RequestConfig = {
  timeout: 10000,
  // 错误处理
  errorConfig: {
    errorThrower: (res) => {
      const { success, data, errorCode, errorMessage } = res;
      if (!success) {
        const error: any = new Error(errorMessage);
        error.name = 'BizError';
        error.info = { errorCode, errorMessage, data };
        throw error;
      }
    },
    errorHandler: (error: any, opts: any) => {
      if (opts?.skipErrorHandler) throw error;
      // 401 跳转登录
      if (error.response?.status === 401) {
        history.push('/login');
        message.error('请先登录');
        return;
      }
      // 403 无权限
      if (error.response?.status === 403) {
        message.error('无权限访问');
        return;
      }
      // 其他错误
      if (error.name === 'BizError') {
        message.error(error.info.errorMessage);
      } else if (error.response) {
        message.error(`请求错误: ${error.response.statusText}`);
      } else {
        message.error('网络异常，请检查网络连接');
      }
    },
  },
  // 请求拦截器
  requestInterceptors: [
    (config: RequestConfig) => {
      // 从localStorage获取token
      const token = localStorage.getItem('zxin-award-token');
      if (token) {
        config.headers = {
          ...config.headers,
          Authorization: `Bearer ${token}`,
        };
      }
      return config;
    },
  ],
  // 响应拦截器
  responseInterceptors: [
    (response: AxiosResponse) => {
      // 拦截响应数据，进行个性化处理
      const { data } = response;
      if (data?.success === false) {
        message.error(data.errorMessage);
      }
      return response;
    },
  ],
};

export const layout = () => {
  return {
    logo: 'https://img.alicdn.com/tfs/TB1YHEpwUT1gK0jSZFhXXaAtVXa-28-27.svg',
    menu: {
      locale: false,
    },
  };
};
